#!/bin/bash 

## @file multimedia_players
## 
## @brief Script para facilitar pasar imágenes, canciones, vídeos a los diferentes mp4 de la casa
##
## Colocando un lanzador en el escritorio, podemos arrastrar cualquier contenido que queramos
## pasar y el proceso automatiza, la reducción de las imagenes al tamaño de la pantalla del mp4
## especificado, conversor de video al formato del mp4 en caso de estar soportado, y la copia de
## las canciones a su carpeta correspondiente
## 
## Uso: multimedia_players [Perfil] [Contenido a pasar]
## 
## Debe especificarse un perfil como primer argumento para saber con que mp4 debemos tratar
##
## <img src="http://www.mamedu.com/gcm/Proyectos/magscripts/gdoxygen/multimedia_players.png" />
## 
## dependencias: convert mencoder /opt/amv-ffmpeg/amv-ffmpeg-linux-i386-20071030 mp3info
## 
## Opciones:
## <pre>
## --help | -h              Pantalla de ayuda
## </pre>
##
## @author   Eduardo Magrané
##
## @internal
##
##       web  http://www.mamedu.com
##
##      mail  eduardo.mamedu.com
##
##  Revision  SVN $Id: $
##
## Copyright  Copyright (c) 2011, Eduardo Magrané
## 
## This source code is released for free distribution under the terms of the
## GNU General Public License as published by the Free Software Foundation.

## Mostrar ayuda

function help() {

   local -i count=0
   while read linea ; do 
      let count++
      if [ $count -gt 2 ] ; then
         [ "$linea" = "" ] && return
         echo "$linea" | sed 's/^##//' | sed 's/@brief //' | sed 's/@file //' 
      fi
   done < "$0"
   echo

   }


# MP4 Gaia Energy sistem 3000 DUO 2G 
#
# Resolución de pantalla 160x128
#
# Para el reproductor de Candela Ingo primero rotamos el video
# mencoder -vf rotate=1 -oac pcm -ovc lavc -o video-rotado.amv Chetes__amp__Amaral_Si_Tu_No_Vuelves.avi 
#
# Pasar a amv:
# /opt/amv-ffmpeg/amv-ffmpeg-linux-i386-20071030 -i video-rotado.avi -f amv -s 128x160 \
# -r 16 -ac 1 -ar 22050 -qmin 3 -qmax 3 video.amv

dependencias=(mp3info)

EXTS_IMAGENES=(jpg jpeg gif raw png)
EXTS_VIDEO=(wmv mpg mov avi mpeg divx mp4 flv)
EXTS_MUSICA=(mp3 MP3)

# Posibles caarpetas donde encontrar letras de canciones
dir_letras=("$HOME/.cache/rhythmbox/lyrics/" "$HOME/.lyrics")

# Posibles carpetas donde encontrar las caratulas
dir_caratulas=("$HOME/.covers" "$HOME/.cache/rhythmbox/covers/")

prog=`basename $0`
LOG="/tmp/${prog}.log"

if [ "$1" == "-help" ] || [ "$1" == "-h" ] ; then
   help
   exit
fi

# Sistema de perfiles para diferentes reproductores
#
# Nombre del perfil::Marca dispositivo::Modelo::anchura::altura::formato vídeo::Punto de montaje::Carpeta imágenes::Carpeta vídeos::Carpeta música

perfiles () {
cat <<EOF
Gaia::Energy Sistem::3000 DUO 2G::128::160::smv::/media/disk/::IMAGES/::MVIDEO/::MUSIC/
Mamen::Philips::2G::128::128::smv::/media/PHILIPS/::Pictures/::Videos/::Music/
Candela::Ingo::Kity::128::160::amv::/media/USB DISK/::fotos/::videos/::musica/
EOF
}

echo 'Configuraciones: '
perfil="$1"
shift 1

eval "$(perfiles | grep $perfil | awk -v FS='::' '{printf "perfil=\"%s\";marca=\"%s\";modelo=\"%s\";anchura=%s;altura=%s;formato_video=%s;punto_montaje=\"%s\";dir_imagenes=\"%s\";dir_videos=\"%s\";dir_musica=\"%s\";", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10 }')"

echo
echo perfil:  $perfil
echo marca:   $marca
echo modelo:  $modelo
echo altura:  $altura
echo anchura: $anchura
echo formato de video: $formato_video
echo punto de montaje: $punto_montaje
echo directorio de imágenes: $dir_imagenes
echo directorio de vídeos: $dir_videos
echo dirrectorio de música: $dir_musica
echo

if [ ! -e "$punto_montaje" ] ; then
   echo "Punto de montaje no encontrado: $punto_montaje"
   read
   exit
fi

## Rotamos si la altura es mayor que la anchura
if [ $altura -gt $anchura ] ; then
   rotar=1
   echo 'Rotar [si]'
else
   rotar=0
   echo 'Rotar [no]'
fi

num_elementos=${#*}
echo "Número de elementos: [$num_elementos]"

# Borramos archivos temporales si los hay
[[ -e "/tmp/${prog}.imagenes" ]] && rm "/tmp/${prog}.imagenes"
[[ -e "/tmp/${prog}.videos" ]] && rm "/tmp/${prog}.videos"
[[ -e "/tmp/${prog}.musica" ]] && rm "/tmp/${prog}.musica"

function pasar_imagenes() {

	extension=$(echo $1 | awk -v FS='.' '{print $(NF)}')
	nombre_fichero="$(basename $1 \.$extension)"
   destino="${punto_montaje}${dir_imagenes}${nombre_fichero}.jpg"
   convert -geometry ${altura}x${anchura} "$1" "$destino"
   if [ $rotar = 1 ] ; then
      echo '  Rotamos imagen'
      convert -rotate 90 "$destino" "$destino"
   fi

   }

function pasar_videos() {

   echo 'Pendiente de desarrollar'

   ## Para el reproductor de Candela Ingo primero rotamos el video
   ## mencoder -vf rotate=1 -oac pcm -ovc lavc -o video-rotado.amv Chetes__amp__Amaral_Si_Tu_No_Vuelves.avi 
   ##
   ## Pasar a amv:
   ## /opt/amv-ffmpeg/amv-ffmpeg-linux-i386-20071030 -i video-rotado.avi -f amv -s 128x160 \
   ## -r 16 -ac 1 -ar 22050 -qmin 3 -qmax 3 video.amv

   nombre_video="`basename "$1"`"
   d="${punto_montaje}${dir_videos}"

   if [ "$formato_video" = "amv" ] ; then

      mencoder -vf rotate=1 -oac pcm -ovc lavc -o "/tmp/$nombre_video" "$1"

      /opt/amv-ffmpeg/amv-ffmpeg-linux-i386-20071030 -i "/tmp/$nombre_video" -f amv -s ${anchura}x${altura} \
      -r 16 -ac 1 -ar 22050 -qmin 3 -qmax 3 "$d${nombre_video}.amv"

   else
      echo "Formato de vídeo no soportado"
      return 1
   fi

   }

function pasar_musica() {

   ART="`mp3info -p '%a' \"$1\"`"
   if [ "$ART" = "" ] ; then ART="Artista desconocido" ; fi
   ALB="`mp3info -p '%l' \"$1\"`"
   if [ "$ALB" = "" ] ; then ALB="Album desconocido" ; fi

   echo "  Artista: $ART"
   echo "  Álbum: $ALB"

   d="${punto_montaje}${dir_musica}${ART}/"

   [[ -d "$d" ]] || mkdir "$d"

   # d="${d}${ALB}/"

   # [[ -d "$d" ]] || mkdir "$d"

   cp "$1" "$d"

   nombre_fichero="`basename "$1" .mp3`"

   ## Mirar si hay letra de canción y añadirla

   for num in `seq 0 $((${#dir_letras[*]}-1))` ; do 
      [[ -e "${dir_letras[$num]}" ]] || continue
      letra="$(find "${dir_letras[$num]}" -iname "$nombre_fichero*")"
      if [ "$letra" != "" ] ; then
         echo "  Añadimos letra de camción"
         cp "$letra" "${d}${nombre_fichero}.lyric"
         continue
      fi
   done

   ## @todo Portada de álbum

   for num in `seq 0 $((${#dir_letras[*]}-1))` ; do 
      [[ -e "${dir_caratulas[$num]}" ]] || continue
      caratula="$(find "${dir_caratulas[$num]}" -iname "$nombre_fichero*")"
      if [ "$caratula" != "" ] ; then
         if [ ! -e "${d}$caratula" ] ; then
            echo "  Añadimos caratula de álbum"
            cp "$caratula" "${d}"
         fi
         continue
      fi
   done

   }

while [ -n "$1" ] ; do

   if [ -d "$1" ] ; then
      # Si el primer parametro es un directorio buscamos las imagenes
      # dentro de él
      DIR="$1"
      echo
      echo Directorio: $DIR
      shift 

      echo Buscando imágenes...

      for num in `seq 0 $((${#EXTS_IMAGENES[*]}-1))` ; do 
         exts=" -iname '*\.${EXTS_IMAGENES[$num]}' "
         cmd="find '$DIR' $exts -printf \"%p\n\" | tee -a /tmp/${prog}.imagenes "
         echo $cmd >> $LOG
         eval $cmd
      done

      echo Buscando videos...

      for num in `seq 0 $((${#EXTS_VIDEO[*]}-1))` ; do 
         exts=" -iname '*\.${EXTS_VIDEO[$num]}' "
         cmd="find '$DIR' $exts -printf \"%p\n\" | tee -a /tmp/${prog}.videos "
         echo $cmd >> $LOG
         eval $cmd

      done

      echo Buscando música...

      for num in `seq 0 $((${#EXTS_MUSICA[*]}-1))` ; do 
         exts=" -iname '*\.${EXTS_MUSICA[$num]}' "
         cmd="find '$DIR' $exts -printf \"%p\n\" | tee -a /tmp/${prog}.musica "
         echo $cmd >> $LOG
         eval $cmd

      done

   else # Nos llega una imagen o video

      reg_img="$(echo ${EXTS_IMAGENES[*]} | tr ' ' '|')"
      reg_vid="$(echo ${EXTS_VIDEO[*]} | tr ' ' '|')"
      reg_mus="$(echo ${EXTS_MUSICA[*]} | tr ' ' '|')"

      if [ "`echo "$1" | egrep -i "$reg_img"`" != "" ] ; then
         echo Imagen: "$1"
         echo "$1" >> /tmp/${prog}.imagenes
      elif [ "`echo "$1" | egrep -i "$reg_vid"`" != "" ] ; then
         echo vídeo: $1
         echo "$1" >> /tmp/${prog}.videos
      elif [ "`echo "$1" | egrep -i "$reg_mus"`" != "" ] ; then
         echo musica: $1
         echo "$1" >> /tmp/${prog}.musica
      else
         echo "Sin vinculo para: $1"
      fi
   fi

   shift 1

done

if [ -e "/tmp/${prog}.imagenes" ] ; then
   imagenes=$(wc -l /tmp/${prog}.imagenes  | cut -d' ' -f 1)
   ## Ordenamos listas
   sort /tmp/${prog}.imagenes > /tmp/${prog}.imagenes.sort
   mv /tmp/${prog}.imagenes.sort /tmp/${prog}.imagenes
else
   imagenes=0
fi

if [ -e "/tmp/${prog}.videos" ] ; then
   videos=$(wc -l /tmp/${prog}.imagenes  | cut -d' ' -f 1)
   sort /tmp/${prog}.videos > /tmp/${prog}.videos.sort
   mv /tmp/${prog}.videos.sort /tmp/${prog}.videos
else
   videos=0
fi

if [ -e "/tmp/${prog}.musica" ] ; then
   musicas=$(wc -l /tmp/${prog}.musica  | cut -d' ' -f 1)
   sort /tmp/${prog}.musica > /tmp/${prog}.musica.sort
   mv /tmp/${prog}.musica.sort /tmp/${prog}.musica
else
   musicas=0
fi




echo $imagenes Imagenes
echo $videos Videos
echo $musicas Canciones de música

if [ "$imagenes" != "0" ] ; then

   # Comprobar destino
   d="${punto_montaje}${dir_imagenes}"
   if [ ! -e "$d" ] ; then
      echo "Falta directorio para imágenes: $d"
      exit
   fi
   DIFS="$IFS" # separador fin de linea para que salga linea por linea
   IFS=$'\n'
   echo
   echo Imágenes
   echo
   for x in `cat /tmp/${prog}.imagenes` ; do
      echo -e "- $x"
      pasar_imagenes "$x"
   done
   IFS="$DIFS"

fi

if [ "$videos" != "0" ] ; then

   # Comprobar destino
   d="${punto_montaje}${dir_videos}"
   if [ ! -e "$d" ] ; then
      echo "Falta directorio para videos: $d"
      exit
   fi
   DIFS="$IFS" # separador fin de linea para que salga linea por linea
   IFS=$'\n'
   echo
   echo Vídeos
   echo
   for x in `cat /tmp/${prog}.videos` ; do
      echo "- $x"
      pasar_videos "$x"
   done
   IFS="$DIFS"

fi

if [ "$musicas" != "0" ] ; then

   # Comprobar destino
   d="${punto_montaje}${dir_musica}"
   if [ ! -e "$d" ] ; then
      echo "Falta directorio para música: $d"
      exit
   fi
   DIFS="$IFS" # separador fin de linea para que salga linea por linea
   IFS=$'\n'
   echo 
   echo Música
   echo 
   for x in `cat /tmp/${prog}.musica` ; do
      echo "- $x"
      pasar_musica "$x"
   done
   IFS="$DIFS"

fi

echo
echo '+--------------------------------+'
echo '| Presiona una tecla para salir  |'
echo '+--------------------------------+'
read

exit

